#include "iot/thing.h"
#include "board.h"
#include "audio_codec.h"

#include "led/circular_strip.h"

#include <driver/gpio.h>
#include <esp_log.h>

#define TAG "LightStrip"

namespace iot {

// 这里仅定义 LightStrip 的属性和方法，不包含具体的实现
class LightStrip : public Thing {
private:
    gpio_num_t WS2812B_GPIO = GPIO_NUM_17;
	static const int NUM_LEDS = 7;  // 定义为静态常量
    bool power_ = false;
	CircularStrip led;  // 使用 CircularStrip 直接初始化

public:
	
    LightStrip() : Thing("LightStrip", "一条RGB灯带"), power_(false),led(WS2812B_GPIO,NUM_LEDS) {
        // 定义设备的属性
        properties_.AddBooleanProperty("power", "灯是否打开", [this]() -> bool {
            return power_;
        });

        // 定义设备可以被远程执行的指令
        methods_.AddMethod("TurnOn", "开灯", ParameterList(), [this](const ParameterList& parameters) {
            power_ = true;
			SetColor({140, 140, 140}); // 默认开灯为白色
        });
		
		// 定义设备可以被远程执行的指令
		methods_.AddMethod("RedLight", "开红灯", ParameterList(), [this](const ParameterList& parameters) {
		    power_ = true;
			SetColor({255, 0, 0});     // 设置所有 LED 为红色
		});
		
		// 定义设备可以被远程执行的指令
		methods_.AddMethod("GreenLight", "开绿灯", ParameterList(), [this](const ParameterList& parameters) {
		    power_ = true;
			SetColor({0, 255, 0});     // 设置所有 LED 为绿色
		});
		
		// 定义设备可以被远程执行的指令
		methods_.AddMethod("BlueLight", "开蓝灯", ParameterList(), [this](const ParameterList& parameters) {
		    power_ = true;
			SetColor({0, 0, 255});     // 设置所有 LED 为蓝色
		});

		// 定义设备可以被远程执行的指令
		methods_.AddMethod("GradientLight", "开彩灯", ParameterList(), [this](const ParameterList& parameters) {
		    power_ = true;
			SetGradient(); // 设置渐变效果
		});
		
        methods_.AddMethod("TurnOff", "关灯", ParameterList(), [this](const ParameterList& parameters) {
            power_ = false;
			SetColor({0, 0, 0}); // 关灯为黑色
        });
    }
private:
	// 设置所有 LED 的颜色
	void SetColor(StripColor color) {
		led.SetAllColor(color);
	}
	// 设置渐变效果
	void SetGradient() {
		led.SetSingleColor(0, {255, 0, 0});
		led.SetSingleColor(1, {0, 255, 0});
		led.SetSingleColor(2, {0, 0, 255});
		led.SetSingleColor(3, {255, 255, 0});
		led.SetSingleColor(4, {255, 0, 255});
		led.SetSingleColor(5, {140, 140, 140});
		led.SetSingleColor(6, {255, 165, 0});
	}
};

} // namespace iot

DECLARE_THING(LightStrip);
